package com.gn.compile;

import com.gn.domain.MyPair;

import java.util.List;

public class App
{
    /**
     * 主文件，将源代码的文件结构更改，接收文件与编译执行分开
     * 执行这个文件的main函数
     **/
    public static void main(String[] args) {
        //输入源代码
        String code = "const const_a = 1;\n" +
                "var var_b;\n" +
                "procedure procedure_c;\n" +
                "  var array_d(3:5), var_b;\n" +
                "  begin\n" +
                "    array_d(1) := 3;\n" +
                "    array_d(2) :=  array_d(1) + 1;\n" +
                "    array_d(2) :=  array_d(1) + 2;\n" +
                "  end;\n" +
                "\n" +
                "begin\n" +
                "  call procedure_c;\n" +
                "end.";
        //调用PL0的静态函数getSource()传入源代码
        PL0 pl0 = PL0.getSource(code);
        //调用getScannerOuts()函数返回二元组的列表
        //注意：结尾必须要有“.”，否则死循环-_- 现在还没有什么好的解决办法，之后看了语法分析再改吧
        //可以没有结束符"."了 ^_^
        //List<MyPair<Integer, String> > scannerOuts = PL0.lex.getScannerOuts();
        //System.out.println(scannerOuts);

        //尝试重复调用
        //List<MyPair<Integer, String> > scannerOuts1 = PL0.lex.getScannerOuts();
        //System.out.println(scannerOuts1);

        //下面进行编译和解释执行
        //加上编译器输出后的调用方法一样，只是phraseList中第一个元素中的第一个String为编译器输出
        pl0.compileAndInterpret();

        //输出p-code代码
        //调用pl0.executeCompile()返回List<Instruction>
        //System.out.println(pl0.executeCompile());

        //打印错误字符串
        //System.out.println("------------");
        System.out.println();
        System.out.println(PL0.errorBuffer);

        //打印指令表
        pl0.printCodeList();
    }
}
